( function() {
	var programs = []; // 程序列表
	// 创建一个程序
	window.program = function( programAttr ) {
		programs.push( programAttr ); // 加入到程序列表中
	};

	// region 常量区
	function empty() {
	};

	// 遍历数组
	function eachArray( list, block ) {
		var i, len;
		for ( i = 0, len = list.length; i < len; i++ ) {
			block( list[i], i );
		}
	}

	var element = Z.element;
	var Box = element.Box;
	var Event = Z.Event;

	function Val( val ) {
		return function() {
			return val;
		};
	}

	function range( min, max, value ) {
		return value < min ? min : ( value > max ? max : value );
	}

	function max( value1, value2 ) {
		return value1 > value2 ? value1 : value2;
	}

	function min( value1, value2 ) {
		return value1 < value2 ? value1 : value2;
	}

	// 双向链表的节点
	function Node( value, previous, next ) {
		return {
			previous : previous,
			next : next,
			value : value
		};
	}

	// 栈布局模板,用来构造行流布局和列流布局
	function StackGroup( type ) {
		function vorh( v, h ) {
			return type === "v" ? v : h;
		}

		var Pos = vorh( function( posSize ) {
					return {
						left : posSize.left
					};
				}, function( posSize ) {
					return {
						top : posSize.top
					};
				} );

		var OffsetLength = vorh( function( area ) {
					return area.offsetHeight;
				}, function( area ) {
					return area.offsetWidth;
				} );

		var Offset = vorh( function( area ) {
					return area.top;
				}, function( area ) {
					return area.left;
				} );

		// 重新布局
		function relayout( node ) {
			var cur, previous;

			// 遍历计算
			for ( cur = node; cur !== null; cur = cur.next ) {
				previous = cur.previous;
				cur.value.offset( previous === null ? 0 : previous.value.offset() + previous.value.offsetLength() );
			}
		}

		return function( container, size ) {
			var tail = null; // 尾节点
			var fatherArea = container.area( size ); // 父区域

			// 在指定的区域前面添加区域
			function allocArea( targetNode, posSize ) {
				var area = fatherArea.area( Pos( posSize || 0 ) ); // 创建区域
				area.width( posSize.width );
				area.height( posSize.height );

				// 创建节点,该节点的前一个节点是目标节点的前一个节点,若目标节点为空则是尾;该节点的后一个节点是目标节点
				var node = Node( {
							offsetLength : OffsetLength( area ),
							offset : Offset( area )
						}, targetNode === null ? tail : targetNode.previous, targetNode );

				// 目标节点为空,插到尾
				if ( targetNode === null ) {
					if ( tail !== null ) {
						tail.next = node;
					}
					tail = node;
				}
				else {
					targetNode.previous( node );
					if ( node.previous !== null ) {
						node.previous.next = node;
					}
				}

				relayout( node );

				return {
					lay : area.lay,
					width : vorh( function( val ) {
								area.width( val );
							}, function( val ) {
								area.width( val );
								relayout( node );
							} ),
					height : vorh( function( val ) {
								area.height( val );
								relayout( node );
							}, function( val ) {
								area.height( val );
							} ),
					offsetWidth : area.offsetWidth,
					offsetHeight : area.offsetHeight,
					remove : function() {
						area.remove();
						var nodeToRelayout = node.previous !== null ? node.previous : node.next;

						// 连接前后
						if ( node.previous !== null ) {
							node.previous.next = node.next;
						}
						if ( node.next !== null ) {
							node.next.previous = node.previous;
						}
						else {
							// node无后,即最后一个节点
							tail = node.previous;
						}

						// 重绘
						relayout( nodeToRelayout );

						// 释放内存
						node = null;
						area = null;
					},
					beforeArea : function( pos ) {
						return allocArea( node, pos );
					},
					afterArea : function( pos ) {
						return allocArea( node.next, pos );
					}
				};
			}

			return {
				area : function( pos ) {
					return allocArea( tail === null ? tail : tail.next, pos );
				},
				left : fatherArea.left,
				top : fatherArea.top,
				zIndex : fatherArea.zIndex,
				width : fatherArea.width,
				height : fatherArea.height,
				offsetWidth : fatherArea.offsetWidth,
				offsetHeight : fatherArea.offsetHeight,
				lay : fatherArea.lay,
				length : function() {
					return tail === null ? 0 : tail.value.offset() + tail.value.offsetLength();
				}
			};
		};
	}
	var HGroup = StackGroup( "h" );

	// 图标
	var iClose = "url(img/sprite_main_png.png) -64px -59px";
	var iCloseHover = "url(img/sprite_main_png.png) -64px -30px";
	var iMax = "url(img/sprite_main_png.png) -34px -59px";
	var iMaxHover = "url(img/sprite_main_png.png) -34px -30px";
	var iReMax = "url(img/sprite_main_png.png) -94px -59px";
	var iReMaxHover = "url(img/sprite_main_png.png) -94px -30px";
	var iMinimize = "url(img/sprite_main_png.png) -5px -58px";
	var iMinimizeHover = "url(img/sprite_main_png.png) -5px -30px";

	var taskbarHeight = 30; // 任务栏高
	var windowMinWidth = 80; // 窗口最小高
	var windowMinHeight = 40; // 窗口最大高
	// endregion

	// region 主函数
	onLoad( function( body ) {
		// region 绘制屏幕
		body.overflowX( "hidden" );
		body.overflowY( "hidden" );

		// 上半部分是桌面
		var desktop = Box( body, {
					background_image : "url(img/img7.jpg)",
					onMousedown : function( event ) {
						event.preventDefault(); // 阻止默认事件
					}
				} );

		// 下半部分是任务栏
		var taskList = HGroup( body, {
					zIndex : 2,
					height : 30
				} );
		var taskBar = Box( taskList, {
					height : taskbarHeight,
					opacity : "0.6",
					background : "#CFD9E5",
					onMousedown : function( event ) {
						event.preventDefault(); // 阻止默认事件
					}
				} );

		// 建立任务
		function newTask() {
			var area = taskList.area( {
						height : 30,
						width : 120
					} );
			var el = element.Button( area, {
						top : 1,
						height : 28,
						width : 120
					} );

			return {
				remove : function() {
					area.remove();
				},
				taskButton : el
			};
		}

		// 用来Hack游标的屏幕
		var screenForCursor = Box( body, {
					zIndex : 2,
					visible : false
				} );

		var desktopResize = Event( function( width, height ) {
					var screenWidth = max( width, 800 );
					var screenHeight = max( height, 600 );
					desktop.width( screenWidth ); // 桌面同屏幕宽
					desktop.height( screenHeight ); // 桌面同屏幕高
					taskList.top( screenHeight - taskbarHeight );
					taskBar.width( screenWidth ); // 任务栏同窗口宽
					taskList.width( screenWidth );
					screenForCursor.width( screenWidth ); // 屏幕宽
					screenForCursor.height( screenHeight ); // 屏幕高
				} );

		// 文档改变大小时重绘
		body.onResize( function( size ) {
					desktopResize.trig( size.width, size.height );
				} );

		// 窗口的宽和高
		var desktopWidth = desktop.offsetWidth;
		var desktopHeight = taskList.top;

		var curFocus = null; // 当前得到焦点的窗口
		function changeFocus( focus ) {
			if ( curFocus !== null ) {
				curFocus.unfocus();
			}
			curFocus = focus;
		}

		// 分发body的事件
		body.onKeydown( function( event ) {
					if ( curFocus !== null ) {
						curFocus.keydown( event );
					}
				} );
		body.onKeyup( function( event ) {
					if ( curFocus !== null ) {
						curFocus.keyup( event );
					}
				} );

		// 点击桌面时失去焦点
		desktop.onMousedown( function() {
					changeFocus( null );
				} );
		// endregion

		// region 创建窗口
		// 创建一个窗口
		function createWindow( windowAttr, onLoad ) {
			// 目标位置和尺寸,指没有被桌面限制的位置和尺寸
			var targetWidth = 0;
			var targetHeight = 0;
			var targetLeft = 0;
			var targetTop = 0;

			// 最大化时储存的非最大化是的位置和尺寸
			var oldWidth = 0;
			var oldHeight = 0;
			var oldLeft = 0;
			var oldTop = 0;

			// 键盘事件
			var keydownEvent = Event();
			var keyupEvent = Event();

			// 启动事件
			var initEvent = Event();

			// 框架区域
			var frameArea = body.area();

			// frame的resize事件,调整frame的大小
			var frameResizeEvent = Event( function( width, height ) {
						frameArea.width( width );
						frameArea.height( height );
						contentResizeEvent.trig( {
									width : width - 10,
									height : height - 35
								} );
					} );
			var onFrameResize = frameResizeEvent.regist; // 注册frame的resize事件
			var frameWidth = frameArea.offsetWidth; // 窗口的宽
			var frameHeight = frameArea.offsetHeight; // 窗口的高

			var contentResizeEvent = Event(); // 内容调整大小事件

			// 修改frame尺寸
			function frameResize( width, height ) {
				targetWidth = width;
				targetHeight = height;
				frameResizeEvent.trig( range( windowMinWidth, desktopWidth(), width ), range( windowMinHeight, desktopHeight(), height ) );
			};

			// 移动frame
			function frameMove( left, top ) {
				targetLeft = left;
				targetTop = top;
				frameArea.left( left );
				frameArea.top( top );
			}

			// 当桌面改变大小时的回调
			var onBodyResize = desktopResize.regist( function( width, height ) {
						frameResizeEvent.trig( min( targetWidth, width ), min( targetHeight, height ) ); // 限制宽高

						// 限制在桌面内
						frameArea.left( range( 20 - frameWidth(), width - 20, targetLeft ) );
						frameArea.top( range( 0, height - 20, targetTop ) );
					} );

			// region 内部事件
			var isFocus = false; // 是否获得焦点
			var focusEvent = Event(); // 聚焦事件
			var unfocusEvent = Event( function() {
						isFocus = false; // 清焦点位
						frameArea.zIndex( 0 ); // 降低zIndex
					} ); // 失焦事件

			function unfocus() {
				unfocusEvent.trig(); // 触发事件
				changeFocus( null ); // 清全局焦点
			}

			function focus() {
				if ( !isFocus ) {
					isFocus = true; // 置焦点位

					// 更换焦点
					changeFocus( {
								keyup : keyupEvent.trig,
								keydown : keydownEvent.trig,
								unfocus : unfocusEvent.trig
							} );

					frameArea.zIndex( 1 ); // 提升zIndex
					focusEvent.trig(); // 触发事件
				}
			};
			frameArea.onMousedown( focus ); // 框架按下鼠标时聚焦

			var isMax = false; // 是否是最大化
			var onMaxEvent = Event( function() {
						// 记录大小
						oldWidth = frameWidth();
						oldHeight = frameHeight();
						oldLeft = frameArea.left();
						oldTop = frameArea.top();

						// 最大化
						frameArea.top( 0 );
						frameArea.left( 0 );
						frameResize( desktopWidth(), desktopHeight() );

						isMax = true; // 置位
					} );

			var onUnmaxEvent = Event( function() {
						// 缩小
						frameArea.top( oldTop );
						frameArea.left( oldLeft );
						frameResize( oldWidth, oldHeight );

						isMax = false; // 清位
					} );

			function toogleMax() {
				if ( !isMax ) {
					onMaxEvent.trig();
				}
				else {
					onUnmaxEvent.trig();
				}
			}

			function display() {
				frameArea.visible( true );
				focus();
			}

			var task = newTask(); // 在任务栏上创建任务
			task.taskButton.onClick( display ); // 鼠标点击时显示

			function removeFrame() {
				// 如果目前在焦点中,主动失焦
				if ( isFocus ) {
					unfocus();
				}

				frameArea.remove(); // 移除框架
				task.remove(); // 移除任务
				onBodyResize.remove(); // 移除事件
			}
			// endregion

			// 透明层
			var transLayer = frameArea.area();
			var transBackground = Box( transLayer, {
						background : "#CFD9E5",
						border_radius : "5px"
					} );

			// 标题
			var title = element.Label( transLayer, {
						left : 7,
						top : 7,
						font_size : "16px",
						font_weight : "bold",
						text_overflow : "ellipsis",
						white_space : "nowrap"
					} );

			// 改变窗口的标题
			function setTitle( text ) {
				title.text( text );
				task.taskButton.text( text );
			}

			// 标题栏
			var titleBar = null;
			titleBar = Box( transLayer, {
						left : 5,
						top : 5,
						height : 20,
						onMousedown : function( event ) {
							// 非最大化时方可拖动
							if ( !isMax ) {
								// 记录点中的位置相对于窗口的坐标
								var posX = event.offsetX + titleBar.left();
								var posY = event.offsetY + titleBar.top();
								event.preventDefault(); // 阻止默认事件

								event.onMousemove( function( event ) {
											frameArea.left( range( -posX, desktopWidth() - posX, event.pageX - posX ) );
											frameArea.top( event.pageY - posY );
										} );

								event.onMouseup( function() {
											// 防止窗口被移出桌面
											frameMove( frameArea.left(), range( 0, desktopHeight() - 20, frameArea.top() ) );
										} );
							}
						}
					} );

			// 内容区域
			var contentArea = frameArea.area( {
						left : 5,
						top : 30
					} );

			// 注册resize事件
			onFrameResize( function( width, height ) {
						transLayer.width( width ); // 透明层同frame宽
						transLayer.height( height ); // 透明层同frame高
						transBackground.width( width ); // 透明层背景同frame宽
						transBackground.height( height ); // 透明背景层同frame高
						titleBar.width( width - 10 ); // 标题栏左右留10
						title.width( width - 70 ); // 标题宽
						contentArea.height( height - 35 ); // 内容宽左右留10
						contentArea.width( width - 10 ); // 距顶30,距底5
					} );

			// region 三个按钮
			// 放置右上角的三个按钮
			function layRihgtTopButton( arg ) {
				var button = null;
				button = element.Anchor( transLayer, {
							top : 7,
							width : 19,
							height : 19,
							background : arg.defaultIcon,
							onMouseover : function() {
								button.background( arg.hover() );
							},
							onMouseout : function() {
								button.background( arg.unhover() );
							},
							onClick : arg.onClick,
							onMousedown : function() {
								focus();
							}
						} );

				onFrameResize( function( width, height ) {
							button.left( width - arg.right );
						} );
				return button;
			}

			var curRight = 3 + 19;
			// 关闭按钮
			layRihgtTopButton( {
						right : curRight,
						defaultIcon : iClose,
						hover : Val( iCloseHover ),
						unhover : Val( iClose ),
						onClick : removeFrame
					} );
			curRight += 20;

			if ( windowAttr.canMax ) {
				// 最大化按钮
				var maxButton = layRihgtTopButton( {
							right : curRight,
							defaultIcon : iMax,
							hover : function() {
								return isMax ? iReMaxHover : iMaxHover;
							},
							unhover : function() {
								return isMax ? iReMax : iMax;
							},
							onClick : toogleMax
						} );
				curRight += 20;

				// 最大化时切换图标
				onMaxEvent.regist( function() {
							maxButton.background( iReMax );
						} );
				onUnmaxEvent.regist( function() {
							maxButton.background( iMax );
						} );

				titleBar.onDblclick( toogleMax );
			}

			// 最小化按钮
			layRihgtTopButton( {
						right : curRight,
						defaultIcon : iMinimize,
						hover : Val( iMinimizeHover ),
						unhover : Val( iMinimize ),
						onClick : function() {
							frameArea.visible( false );
							// 如果是焦点,主动失焦
							if ( isFocus ) {
								unfocus();
							}
						}
					} );
			// endregion

			// region resizer相关
			// 往上拉或往左拉的模板
			function UpOrLeft( arg ) {
				return function( targetPos ) {
					var targetOpPos = arg.targetPos() + arg.targetOffset(); // 对面的位置
					targetPos = range( 0, targetOpPos - arg.targetMin, targetPos ); // 实际目标长
					var targetSize = min( targetOpPos - targetPos, arg.maxSize() ); // 目标长
					arg.targetPos( targetOpPos - targetSize );
					arg.targetSize( targetSize );
				};
			}

			var toTop = UpOrLeft( {
						targetPos : frameArea.top,
						targetOffset : frameHeight,
						targetSize : function( val ) {
							frameResize( frameWidth(), val );
						},
						targetMin : windowMinHeight,
						maxSize : desktopHeight
					} );

			var toLeft = UpOrLeft( {
						targetPos : frameArea.left,
						targetOffset : frameWidth,
						targetSize : function( val ) {
							frameResize( val, frameHeight() );
						},
						targetMin : windowMinWidth,
						maxSize : desktopWidth
					} );

			function toBottom( val ) {
				frameResize( frameWidth(), val - frameArea.top() );
			}

			function toRight( val ) {
				frameResize( val - frameArea.left(), frameHeight() );
			}

			function layResizer( onResize, cursor, onMove ) {
				var resizer = Box( frameArea, {
							cursor : cursor,
							onMousedown : function( event ) {

								screenForCursor.cursor( cursor );
								screenForCursor.visible( true );
								var posX = event.offsetX;
								var posY = event.offsetY;
								event.preventDefault(); // 阻止默认事件

								event.onMousemove( function( event ) {
											onMove( {
														offsetX : event.pageX,
														offsetY : min( event.pageY, desktopHeight() )
													}, {
														posX : posX,
														posY : posY
													} );
										} );

								event.onMouseup( function() {
											screenForCursor.cursor( "auto" );
											screenForCursor.visible( false );
										} );
							}
						} );

				onFrameResize( function( width, height ) {
							onResize( width, height, [{
												offset : resizer.left,
												length : resizer.width
											}, {
												offset : resizer.top,
												length : resizer.height
											}] );
						} );
				onMaxEvent.regist( function() {
							resizer.visible( false );
						} );
				onUnmaxEvent.regist( function() {
							resizer.visible( true );
						} );
			}

			function LayResizer( x, y ) {
				function empty() {
				};

				// 三分,当e是0时返回zero,-1时返回neg,+1时返回pos
				function select( e, neg, zero, pos ) {
					return e === 0 ? zero : e === -1 ? neg : pos;
				}

				// 定位尺寸函数
				var Resize = function( selector, pos ) {
					return select( selector, function( width, height, op ) {
								op[pos].offset( 0 );
								op[pos].length( 5 );
							}, function( width, height, op ) {
								op[pos].offset( 5 );
								op[pos].length( ( pos === 0 ? width : height ) - 10 );
							}, function( width, height, op ) {
								op[pos].offset( ( pos === 0 ? width : height ) - 5 );
								op[pos].length( 5 );
							} );
				};
				var xResize = Resize( x, 0 );
				var yResize = Resize( y, 1 );

				// 游标
				var cursor = select( y, "n", "", "s" ) + select( x, "w", "", "e" ) + "-resize";

				// move指令
				var leftInst = select( x, toLeft, empty, toRight );
				var topInst = select( y, toTop, empty, toBottom );

				layResizer( function( width, height, op ) {
							xResize( width, height, op );
							yResize( width, height, op );
						}, cursor, function( el, pos ) {
							leftInst( el.offsetX + x * pos.posX );
							topInst( el.offsetY + y * pos.posY );
						} );
			}

			var i = 0, j = 0;
			if ( windowAttr.canResize ) {
				// 放置resizer
				for ( i = -1; i <= 1; ++i ) {
					for ( j = -1; j <= 1; ++j ) {
						if ( !( i == 0 && j == 0 ) ) {
							LayResizer( i, j );
						}
					}
				}
			}
			// endregion

			// 得到焦点时更改标题颜色
			focusEvent.regist( function() {
						title.color( "black" );
						transBackground.opacity( "0.6" );
					} );
			unfocusEvent.regist( function() {
						title.color( "gray" );
						transBackground.opacity( "0.8" );
					} );

			// 绘制,移动,聚焦
			frameResize( windowAttr.width, windowAttr.height );
			frameMove( windowAttr.left, windowAttr.top );

			setTitle( windowAttr.title );

			// 回调启动程序
			onLoad( {
						area : contentArea.area,
						lay : contentArea.lay,
						Timer : body.Timer,
						getHeight : contentArea.offsetHeight,
						getWidth : contentArea.offsetWidth,
						height : function( val ) {
							frameResize( frameWidth(), val + 35 );
						},
						width : function( val ) {
							frameResize( val + 10, frameHeight() );
						},
						title : setTitle,
						onResize : contentResizeEvent.regist,
						onInit : initEvent.regist,
						onKeydown : keydownEvent.regist,
						onKeyup : keyupEvent.regist,
						onFocus : focusEvent.regist,
						onUnfocus : unfocusEvent.regist,
						onMax : onMaxEvent.regist,
						onUnmax : onUnmaxEvent.regist
					} );

			// 再次重绘
			frameResize( windowAttr.width, windowAttr.height );
			focus();
			initEvent.trig();
		}

		// 遍历程序列表,制作桌面图标
		eachArray( programs, function( item, i ) {
					function load() {
						createWindow( item.windowAttr, item.onLoad );
					}

					// 图标区域
					var iconArea = body.area( {
								top : i * 100 + 10,
								width : 84,
								height : 80
							} );

					var background = Box( iconArea, {
								width : 84,
								height : 80,
								background_color : "#CFD9E5",
								opacity : 0,
								border_radius : "5px"
							} );

					// 图标
					element.Image( iconArea, {
								left : 17,
								top : 6,
								width : 50,
								height : 50,
								src : item.icon
							} );

					// 标题
					element.Label( iconArea, {
								left : 7,
								top : 59,
								width : 70,
								text_align : "center",
								font_family : "微软雅黑",
								font_size : "14px",
								text : item.title,
								text_overflow : "ellipsis",
								white_space : "nowrap",
								color : "white",
								text_shadow : "1px 1px 0px black, -1px -1px 0px black, 1px -1px 0px black, -1px 1px 0px black"
							} );

					// 悬停变色
					iconArea.onMouseover( function() {
								background.opacity( background.opacity() + 0.2 );
							} );
					iconArea.onMouseout( function() {
								background.opacity( background.opacity() - 0.2 );
							} );

					// 点击时获得焦点,并变色
					iconArea.onMousedown( function() {
								background.opacity( background.opacity() + 0.3 );
								changeFocus( {
											keyup : empty,
											keydown : function( event ) {
												// 获得焦点时,按回车加载程序
												if ( event.keyCode === 13 ) {
													load();
												}
											},
											unfocus : function() {
												background.opacity( background.opacity() - 0.3 );
											}
										} );
							} );

					// 双击时加载程序
					iconArea.onDblclick( function() {
								load();
							} );
				} );

			// endregion
		} );
	// endregion
} )();